package ar.edu.utn.frba.dds.tp.code.adapter;

import java.util.ArrayList;
import java.util.List;

import ar.edu.utn.frba.dds.tp.code.Asientos.AsientoDeVuelo;
import ar.edu.utn.frba.dds.tp.code.Asientos.EstadoAsiento;
import ar.edu.utn.frba.dds.tp.code.lugares.Lugar;
import ar.edu.utn.frba.dds.tp.code.usuarios.Usuario;
import ar.edu.utn.frba.dds.tp.code.usuarios.UsuarioStandard;
import ar.edu.utn.frba.dds.tp.code.vuelos.Aerolinea;
import ar.edu.utn.frba.dds.tp.code.vuelos.Busqueda;
import ar.edu.utn.frba.dds.tp.code.vuelos.RegistroCompraAsientos;
import ar.edu.utn.frba.dds.tp.code.vuelos.Vuelo;

import com.oceanic.AerolineaOceanic;
import com.oceanic.AsientoDTO;

public class OceanicAdapter extends Aerolinea {
	
	private AerolineaOceanic aerolineaOceanic = AerolineaOceanic.getInstance();
	private OceanicConversor conversor = new OceanicConversor();

	//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
	//+++ Oceanic ++++++++++++++++++++++++++++++++++++++++++++++++
	//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
	
	@Override
	public void comprarAsiento(AsientoDeVuelo asiento, Usuario comprador) {
		String codigoVuelo = asiento.getCodigoDeVuelo();
		int numeroDeAsiento = asiento.getNumeroDeAsiento();
		String dni = Integer.toString(comprador.getDni());
		if(aerolineaOceanic.comprarSiHayDisponibilidad(dni, codigoVuelo, numeroDeAsiento)){
			asiento.setEstado(EstadoAsiento.COMPRADO);
			asiento.eliminarSobreReservantes();
			RegistroCompraAsientos.getInstance().incValue(this, asiento.getVuelo());
		}
	}
	
	@Override
	public List<Vuelo> vuelosDisponibles(Busqueda busqueda) {
		List<AsientoDTO> asientosOceanic = busqueda.getDestino().disponiblesDe(this,busqueda);
		ArrayList<Vuelo> vuelos = new ArrayList<Vuelo>();
		
		for (AsientoDTO asientoDTO : asientosOceanic) {
			this.ponerEnVuelo(conversor.convertirAsiento(asientoDTO), vuelos);
		}
				
		return vuelos;
	}

	public List<AsientoDTO> realizarBusquedaCon(Lugar lugar,Busqueda busqueda) {
		String origen = this.conversor.fromLugarToLugarOceanic(busqueda.getOrigen().getLugar());
		String destino = this.conversor.fromLugarToLugarOceanic(busqueda.getDestino().getLugar());
		String fechaDeSalida = busqueda.getFechaSalida().toString("dd/MM/yyyy");
		return this.aerolineaOceanic.asientosDisponiblesParaOrigenYDestino(origen, destino, fechaDeSalida);
	}

	public List<AsientoDTO> realizarBusquedaSin(Busqueda busqueda) {
		String origen = this.conversor.fromLugarToLugarOceanic(busqueda.getOrigen().getLugar());
		String fechaDeSalida = busqueda.getFechaSalida().toString("dd/MM/yyyy");
		return this.aerolineaOceanic.asientosDisponiblesParaOrigen(origen, fechaDeSalida);
	}
	
	//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
	//+++ Reservas +++++++++++++++++++++++++++++++++++++++++++++++
	//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
	
	@Override
	public void reservarAsiento(AsientoDeVuelo asiento, UsuarioStandard reservante){
		String codigoVuelo = asiento.getCodigoDeVuelo();
		String dni = Integer.toString(reservante.getDni());
		int numeroDeAsiento = asiento.getNumeroDeAsiento();
		
		if(!aerolineaOceanic.estaReservado(codigoVuelo, numeroDeAsiento)){
			aerolineaOceanic.reservar(dni, codigoVuelo, numeroDeAsiento);
			asiento.setEstado(EstadoAsiento.RESERVADO);
		}
		else
			asiento.agregarSobreReserva(reservante);
	}
	
	public void expiroReserva(AsientoDTO asientoDTO){  // asientoDTO como los maneja oceanic 
		
		AsientoDeVuelo asiento = conversor.convertirAsiento(asientoDTO);
		transferirReserva(asiento);
	}
}
